package com.panda.utils;

import com.panda.expand.*;
import com.panda.expand.extend.Goto;
import com.panda.pojo.Context;
import com.panda.pojo.Element;

import java.util.HashSet;
import java.util.Set;

/*
    采用门面模式,如果需要扩展,可以使用该类进行操作
 */
public class ExpandInit {

    private static Set<String> targets = new HashSet<>(), noBodyTags = new HashSet<>();

    public static Set<String> getNoBodyTags() {
        return noBodyTags;
    }

    public static Set<String> getTargets() {
        return targets;
    }

    public static void removeAllTargets() {
        targets.clear();
    }

    public static void removeAllNobodyTags() {
        noBodyTags.clear();
    }

    public static void addNoBodyTag(String tag) {
        noBodyTags.add(tag);
    }

    public static void addTag(String tag) {
        noBodyTags.add(tag);
    }

    //可以单独添加体解析器
    public static void addBodyParser(BodyParser bodyParser) {
        ParseUtils.addBodyParser(bodyParser);
    }

    //添加糖
    public static void addSugar(Sugar sugar) {
        ParseUtils.addSugar(sugar);
    }

    public static void addParamParser(ParamParser paramParser) {
        ParseUtils.addParamParser(paramParser);
    }

    private static Set<Extend> extendSet= new HashSet<>();

    public static Set<Extend> getExtendSet() {
        return extendSet;
    }

    static void init() {

        extendSet.add(Goto.INSTANCE);

        addBodyParser(Goto.INSTANCE);

        ParseUtils.setTargets(targets);
        ParseUtils.setNoBodyTags(noBodyTags);
        targets.add("Big");
        targets.add("Select");
        targets.add("Legend");
        targets.add("Wbr");
        targets.add("Caption");
        targets.add("Textarea");
        targets.add("Del");
        targets.add("Hr");
        targets.add("Output");
        targets.add("Embed");
        targets.add("Abbr");
        targets.add("Canvas");
        targets.add("Nav");
        targets.add("Frameset");
        targets.add("Var");
        targets.add("Dfn");
        targets.add("Input");
        targets.add("Meta");
        targets.add("Style");
        targets.add("Rp");
        targets.add("Object");
        targets.add("Sub");
        targets.add("Rt");
        targets.add("Strong");
        targets.add("Samp");
        targets.add("Sup");
        targets.add("Br");
        targets.add("Audio");
        targets.add("Iframe");
        targets.add("Map");
        targets.add("Table");
        targets.add("A");
        targets.add("B");
        targets.add("Address");
        targets.add("Acronym");
        targets.add("Bdi");
        targets.add("Strike");
        targets.add("I");
        targets.add("Bdo");
        targets.add("Menu");
        targets.add("P");
        targets.add("Td");
        targets.add("Tfoot");
        targets.add("Q");
        targets.add("S");
        targets.add("Script");
        targets.add("Th");
        targets.add("U");
        targets.add("Cite");
        targets.add("Progress");
        targets.add("Li");
        targets.add("Tr");
        targets.add("Font");
        targets.add("Span");
        targets.add("Dd");
        targets.add("Small");
        targets.add("Tt");
        targets.add("Col");
        targets.add("Optgroup");
        targets.add("Tbody");
        targets.add("Dl");
        targets.add("Fieldset");
        targets.add("Main");
        targets.add("Section");
        targets.add("Source");
        targets.add("Body");
        targets.add("Dir");
        targets.add("Div");
        targets.add("Dt");
        targets.add("Ul");
        targets.add("Details");
        targets.add("Html");
        targets.add("Area");
        targets.add("Blockquote");
        targets.add("Pre");
        targets.add("Meter");
        targets.add("Em");
        targets.add("Article");
        targets.add("Noframes");
        targets.add("Aside");
        targets.add("Noscript");
        targets.add("Header");
        targets.add("Applet");
        targets.add("Figcaption");
        targets.add("Frame");
        targets.add("Option");
        targets.add("Img");
        targets.add("Code");
        targets.add("Footer");
        targets.add("Thead");
        targets.add("Link");
        targets.add("H1");
        targets.add("H2");
        targets.add("H3");
        targets.add("Video");
        targets.add("Basefont");
        targets.add("H4");
        targets.add("Title");
        targets.add("H5");
        targets.add("H6");
        targets.add("Keygen");
        targets.add("Button");
        targets.add("Head");
        targets.add("Dialog");
        targets.add("Param");
        targets.add("Track");
        targets.add("Ol");
        targets.add("Summary");
        targets.add("Figure");
        targets.add("Datalist");
        targets.add("Center");
        targets.add("Colgroup");
        targets.add("Label");
        targets.add("Kbd");
        targets.add("Command");
        targets.add("Ins");
        targets.add("Ruby");
        targets.add("Form");
        targets.add("Time");
        targets.add("Mark");
        targets.add("Menuitem");
        targets.add("Base");

        noBodyTags.add("Input");
        noBodyTags.add("Br");
        noBodyTags.add("Meta");

        //内置ng-体解析器
        addBodyParser(new NgBindBodyParser());



        //对context中的混合指令解析器加壳
        addSugar(new Sugar() {

            @Override
            public String parseBody(Context context, Element element, String s) {
                return context.getCompositeElementSugar().parseBody(context, element, s);
            }

            @Override
            public String parseParam(Context context, Element element, String s) {
                return context.getCompositeElementSugar().parseParam(context, element, s);
            }

            @Override
            public boolean canParse(String s, Context context) {

                //对context进行包装
                return context.getCompositeElementSugar().canParse(s, context);
            }

            @Override
            public void doParse(String e, Context context) {
                context.getCompositeElementSugar().parse(e, context);
            }
        });

        addSugar(new TransformElementSugar());



    }


}
